#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name：    operation_yaml.py
   Author :       zyq
   CreateDate：   2024/7/18 14:12
   Remark :  解析 yaml 文件工具类
-------------------------------------------------
"""

import yaml

from guitesting.config.Path import CONFIG_PATH


def check_yaml(func):
    """
    为函数添加YAML配置文件读取的异常处理装饰器。

    Args:
        func (callable): 需要被装饰的函数，该函数预期会读取YAML配置文件。

    Returns:
        callable: 返回一个函数，该函数在被调用时会尝试执行被装饰的函数，并处理可能发生的异常。

    Raises:
        KeyError: 如果在配置文件中未找到对应的键，则会抛出带有自定义错误信息的KeyError异常。
        Exception: 如果在读取配置文件时发生其他未知异常，则会抛出带有自定义错误信息的Exception异常。

    """

    def warpper(*args, **kwargs):
        try:
            # 调用被装饰的函数，并传入参数
            res = func(*args, **kwargs)
            return res
        except KeyError:
            # 如果发生KeyError异常，则抛出带有自定义错误信息的KeyError异常
            raise KeyError("未在配置找到对应的键")
        except Exception:
            # 如果发生其他异常，则抛出带有自定义错误信息的Exception异常
            raise Exception("读取配置文件发生未知异常")

    return warpper


class ReadYaml:
    __obj = None

    @staticmethod
    def __new__(cls, *args, **kwargs):
        if not cls.__obj:
            cls.__obj = super().__new__(cls)
        return cls.__obj

    # 方法初始化的时候读取yaml文件
    def __init__(self, file_path=None):
        """
        初始化方法，用于读取YAML文件并解析为Python对象。

        Args:
            file_url (str, optional): YAML文件的URL或路径。默认为None，表示使用默认YAML文件。

        Raises:
            Exception: 当YAML文件读取或解析发生异常时，抛出异常并提示"yaml文件读取异常"。

        Returns:
            None

        """
        try:
            self.file_path = file_path if file_path else CONFIG_PATH
            # 打开默认的YAML文件
            with open(file=self.file_path, mode='r', encoding='UTF-8') as file:
                # 读取文件内容并解析为Python对象
                self.__yaml_data: dict = yaml.load(file.read(), Loader=yaml.FullLoader)

        except Exception as e:
            # 抛出异常，提示yaml文件读取异常
            raise f"yaml文件{file_path}解析异常\n{e}"

    def get_data(self, key=None) -> dict:
        """
        获取yaml文件中的配置信息
        :param key: 键值
        :return: 返回对应的值
        """
        return self.__yaml_data.get(key) if key else self.__yaml_data

    @check_yaml
    def get_mysql_config(self, mysql_name: str = None) -> dict:
        """
        获取数据库配置
        :return: 返回数据库配置字典
        """
        if self.__yaml_data['global'].upper() != 'PRO':
            return self.__yaml_data['Mysql_test']
        else:
            return self.__yaml_data['Mysql_PRO'].get(mysql_name)

    @check_yaml
    def get_every_config(self, key) -> dict:
        """
        获取任意的配置文件内容
        :param key: 配置文件的键
        :return: 返回对的值
        """
        return self.__yaml_data[key]


if __name__ == '__main__':
    # 获取config.py中的Config类
    x = ReadYaml().get_data()
    # 输出全局等待时间的值
    print(x)
